package view;

import java.util.Observable;

/**
 * Clase abstracta IMainView define todas las funciones
 * que deben implementar las diferentes vista para el 
 * correcto funcionamiento del programa
 */
public abstract class IMainView extends Observable{
   
    /**
     * Actualiza el tiempo de partida por pantalla
     * @param time 
     */
    abstract public void refreshTime(String time);
    
    /**
     * Establece la matriz original del juego
     * @param param 
     */
    abstract public void setMatriz(int[][] param);
    
    /**
     * Obtiene la matriz actual del tablero
     * @return 
     */
    abstract public int[][] getMatriz();
    
    /**
     * Establece un numero en una celda dada
     * @param fil
     * @param col
     * @param value 
     */
    abstract public void setNum(int fil,int col,int value);
    
    /**
     * Establece un numero en una celda dad marcandola como pista del juego
     * @param fil
     * @param col
     * @param value 
     */
    abstract public void setPista(int fil,int col,int value);
    
    /**
     * Establece el numero de una celda dada
     * @param fil
     * @param col
     * @return 
     */
    abstract public int getNum(int fil,int col);
    
    /**
     * Establece una celda como incorrecta
     * @param fil
     * @param col 
     */
    abstract public void setWrong(int fil,int col);
    
    /**
     * Establece una celda como normal
     * @param fil
     * @param col 
     */
    abstract public void setNormal(int fil,int col);
    
    /**
     * Establece una celda como correcta
     * @param fil
     * @param col 
     */
    abstract public void setCorrect(int fil,int col);
    

    /**
     * Habilita la interaccion con el tablero
     */
    abstract public void habilitarTablero();
    
    
    /**
     * Evita la interaccion con el tablero
     */
    abstract public void deshabilitarTablero();
    
    /**
     * Habilita controles como resolver,pista, etc.
     * Se usa para evitar accion como pista nates de 
     * haber comenzado una partida.
     */
    abstract public void habilitarControles(boolean var);
    
    /**
     * Actualiza la puntuacion del juego actual por pantalla
     * @param punt 
     */
    abstract public void refreshPuntuacion(String punt);
    
    /**
     * Actualiza el contador de numeros restantes de la partida
     * actual por pantalla
     * @param num 
     */
    abstract public void refreshContador(String num);
    
    /**
     * Obtiene el nombre del jugador Actual
     * @return string con el nombre
     */
    abstract public String getPlayerName();
    
    /**
     * Estable el nombre del jugador Actual en la vista
     */
    abstract public void setPlayerName(String nomb);
    
    /**
     * Muestra un mensage de advertencia por pantalla
     */
    abstract public void showWarningMessage(String msg);
    
    /**
     * Muesta un mensage de informacion por pantalla
     */
    abstract public void showInfoMessage(String msg);
    
    /**
     * Muestra un mensaje de confirmacion por pantalla
     * @return true/false segun desicion 
     */
    abstract public boolean showConfirmationMessage(String msg);

    /**
     * Cierra la ventana actual
     */
    abstract public void dispose();
    
    /**
     * Evita la interaccion con la ventana actual
     * @param val true:evita, false:permite
     */
    abstract public void disable(Boolean val);
    
    /**
     * Reclama el foco hacia la ventana principal
     * y la trae al frente
     */
    abstract public void requestFocus();
}
